package cn.jingyuan.bee.utils.map;

import java.io.Serializable;
import java.util.Map;

/**
 * Map 创建类
 *
 * @param <K> Key 类型
 * @param <V> Value 类型
 */
public class MapBuilder<K, V> implements Serializable {

    private final Map<K, V> map;

    /**
     * 链式 Map 创建类
     *
     * @param map 要使用的 Map 实现类
     */
    public MapBuilder(Map<K, V> map) {
        this.map = map;
    }

    /**
     * 创建 Builder
     *
     * @param <K> Key 类型
     * @param <V> Value 类型
     * @param map Map 实体类
     *
     * @return MapBuilder
     */
    public static <K, V> MapBuilder<K, V> create(Map<K, V> map) {
        return new MapBuilder<>(map);
    }

    /**
     * 链式 Map 创建
     *
     * @param k Key 类型
     * @param v Value 类型
     *
     * @return 当前类
     */
    public MapBuilder<K, V> put(K k, V v) {
        map.put(k, v);
        return this;
    }

    /**
     * 链式 Map 创建
     *
     * @param map 合并 map
     *
     * @return 当前类
     */
    public MapBuilder<K, V> putAll(Map<K, V> map) {
        this.map.putAll(map);
        return this;
    }

    /**
     * 创建后的 map
     *
     * @return 创建后的 map
     */
    public Map<K, V> map() {
        return map;
    }

    /**
     * 创建后的 map
     *
     * @return 创建后的 map
     */
    public Map<K, V> build() {
        return map();
    }

    /**
     * 将 map 转成字符串
     *
     * @param separator entry 之间的连接符
     * @param keyValueSeparator kv 之间的连接符
     *
     * @return 连接字符串
     */
    public String join(String separator, final String keyValueSeparator) {
        return MapUtils.join(this.map, separator, keyValueSeparator);
    }

    /**
     * 将 map 转成字符串
     *
     * @param separator entry 之间的连接符
     * @param keyValueSeparator kv 之间的连接符
     *
     * @return 连接后的字符串
     */
    public String joinIgnoreNull(String separator, final String keyValueSeparator) {
        return MapUtils.joinIgnoreNull(this.map, separator, keyValueSeparator);
    }

    /**
     * 将 map 转成字符串
     *
     * @param separator entry 之间的连接符
     * @param keyValueSeparator kv 之间的连接符
     * @param isIgnoreNull 是否忽略 null 的键和值
     *
     * @return 连接后的字符串
     */
    public String join(String separator, final String keyValueSeparator, boolean isIgnoreNull) {
        return MapUtils.join(this.map, separator, keyValueSeparator, isIgnoreNull);
    }

}